Recursive go pattern
主関数の再帰処理を、内部関数に任せる
この内部関数をgoと命名することが多い
code:hs
where
go ..
関数goの特徴
再帰処理に必要な追加の引数を持つ
e.g. 累積値, index, 部分結果
(結果ではなく)引数に、更新したい状態を持っている感じ
再帰操作が分離されているため、前後の処理を追加しやすい
まあでもこれは、通常の内部関数と同じ話だろうmrsekut.icon
具体例
要素が偶数であるリストの要素数をカウントする関数
goを使ってないもの
code:not_go.hs
countEvens :: Int -> Int
countEvens [] = 0
countEvens (x:xs)
| even x = 1 + countEvens xs
| otherwise = countEvens xs
結果が返り値となる主関数を再帰している
go pattern
code:go.hs
countEvensGo :: Int -> Int
countEvensGo list = go 0 list
where
go :: Int -> Int -> Int
go count [] = count
go count (x:xs)
| even x = go (count + 1) xs
| otherwise = go count xs
goの引数に状態(要素数)を持たせている
主関数では、goに初期値(0)を渡して進めている
Haskell mini-patterns handbook :: Kowainik
#functional_mini_patterns